package com.hs.dynamic.config;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Primary;
import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource;
import org.springframework.stereotype.Component;

import javax.sql.DataSource;
import java.util.HashMap;
import java.util.Map;

/**
 * @Description: 往Spring容器中添加一个AbstractRoutingDataSource 类型的bean
 *              使用AbstractRoutingDataSource创建两个库，R表示读库，W表示写库。
 * @Author 胡尚
 * @Date: 2024/8/2 12:32
 */
@Component("dynamicDataSource")
@Primary
public class DynamicDataSource extends AbstractRoutingDataSource {

    /**
     * 声明一个ThreadLocal对象，在controller方法中会往这里面存值
     */
    public static ThreadLocal<String> dataSourceKey =new ThreadLocal<>();

    @Autowired
    @Qualifier("dataSource1")
    private DataSource dataSource1;

    @Autowired
    @Qualifier("dataSource2")
    private DataSource dataSource2;

    @Override
    protected Object determineCurrentLookupKey() {
        // 从ThreadLocal中取值
        return dataSourceKey.get();
    }

    @Override
    public void afterPropertiesSet() {
        // 在初始化方法中，将我们创建的两个数据源进行set
        // 我们定义其中一个为写库 一个为读库
        // 这里的key要和Controller层存入ThreadLocal中的key对应上
        Map<Object, Object> targetDataSources = new HashMap<>(16);
        targetDataSources.put("hsW", dataSource1);
        targetDataSources.put("hsR", dataSource2);

        // 将我们创建的两个数据源进行set
        super.setTargetDataSources(targetDataSources);
        // 为defaultTargetDataSource 设置默认的数据源
        super.setDefaultTargetDataSource(dataSource1);

        super.afterPropertiesSet();
    }
}
